
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>并发容器与工具类 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>并发容器与工具类 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Java中的并发容器相比于传统的同步容器（如`Vector`、`Hashtable`）有何核心优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">并发容器是为了在多线程环境下高效管理共享数据而设计的，它们提供了线程安全的操作。与传统的同步容器相比，它们通常通过更精细的锁机制或无锁算法来减少锁竞争，从而具有更高的并发性能。</div>
          </div>
          <div class="card-source">来源: 1. 并发容器（Concurrent Collections）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">请解释`ConcurrentHashMap`是如何通过“分段锁”来提高并发性能的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`ConcurrentHashMap`通过将内部数据结构分为多个段（Segment），每个段都拥有独立的锁。这减小了锁的粒度，使得不同线程可以在不同的段上并发地执行操作。写操作仅锁住对应的段，而读操作不会阻塞其他线程的读取，从而显著提高了并发性能。</div>
          </div>
          <div class="card-source">来源: 1.1 ConcurrentHashMap</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">`CopyOnWriteArrayList`的工作原理是什么？这种机制决定了它最适合哪种应用场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当对`CopyOnWriteArrayList`进行修改操作（如add, remove）时，它会复制整个底层数组，在新数组上进行修改，然后将引用指向新数组。这个过程保证了读取操作不需要加锁，可以高效并发。因此，它最适合“读多写少”的应用场景，例如事件监听器列表。</div>
          </div>
          <div class="card-source">来源: 1.2 CopyOnWriteArrayList</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">`BlockingQueue`在生产者-消费者模式中是如何避免线程因“忙等”而浪费CPU资源的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`BlockingQueue`提供了阻塞的入队和出队操作。当队列满时，尝试添加元素的生产者线程会被阻塞，直到队列有可用空间；当队列为空时，尝试获取元素的消费者线程会被阻塞，直到队列中有元素。这种阻塞机制避免了线程进行无效的轮询（忙等），从而节省了CPU资源。</div>
          </div>
          <div class="card-source">来源: 1.3 BlockingQueue</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">`ConcurrentLinkedQueue`实现高并发和线程安全所依赖的核心技术是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`ConcurrentLinkedQueue`是一个线程安全的无界队列，它采用非阻塞的方式进行操作。其核心技术是基于CAS（Compare-And-Swap）的无锁算法来保证并发安全，避免了使用锁带来的开销，因此在队列操作频繁的高并发场景中非常高效。</div>
          </div>
          <div class="card-source">来源: 1.4 ConcurrentLinkedQueue</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">框架</div>
          <div class="card-question">Java的`Executor`框架在并发编程中的主要作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">框架</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`Executor`框架的主要作用是提供一种将任务提交与线程执行分离开来的机制。它有效地管理线程池和任务调度，避免了开发者直接创建和管理`Thread`对象的复杂性，从而简化了并发程序的开发。</div>
          </div>
          <div class="card-source">来源: 2.1 Executor Framework</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">工具</div>
          <div class="card-question">`CountDownLatch`是如何实现“等待多个线程完成操作”这一同步功能的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">工具</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`CountDownLatch`通过一个初始化的计数器来管理同步。需要等待的线程调用`await()`方法并阻塞。其他线程在完成各自的任务后调用`countDown()`方法使计数器减一。当计数器减至0时，所有调用`await()`方法的线程都会被释放并继续执行。</div>
          </div>
          <div class="card-source">来源: 2.2 CountDownLatch</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">工具</div>
          <div class="card-question">`CyclicBarrier`和`CountDownLatch`有何不同？`CyclicBarrier`适用于什么场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">工具</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`CyclicBarrier`允许一组线程相互等待，直到所有线程都到达一个公共的同步点（barrier），然后所有线程再一起继续执行，并且它可以被重用。它适用于需要一组线程协同工作，在完成一个阶段后进行同步，再一起进入下一个阶段的场景，如并行计算中的阶段性同步。</div>
          </div>
          <div class="card-source">来源: 2.3 CyclicBarrier</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">工具</div>
          <div class="card-question">`Semaphore`（信号量）在并发编程中的主要用途和工作原理是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">工具</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`Semaphore`的主要用途是控制同时访问某个特定资源的线程数量。其工作原理是维护一个表示可用许可数量的计数器。线程通过`acquire()`获取许可（计数器减一），如果许可数量为0则阻塞。线程访问完资源后通过`release()`释放许可（计数器加一）。</div>
          </div>
          <div class="card-source">来源: 2.4 Semaphore</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
